package util;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

/*
 将 pinyin4j 第三方库封装成工具类，输入一个字符串，可以获取到对应的拼音（全拼/拼音首字母）
 */
public class PinyinUtil {

    /**
     *
     * @param src 表示要获取拼音的字符串
     * @param fullSpell 表示是否要全拼，比如针对 “基础语法” 这样的字符串来说，
     *                  如果第二个参数为 true，得到 jichuyufa 结果
     *                  如果为 false，得到 jcyf 的结果
     * @return
     * 这个 Pinyin4j 即使得到多音字，数组元素的 0 号元素大概率也是常用的发音了
     *      此处针对多音字，只取第 1个发音，作为最终结果
     *      要想得到更精确的 “多音字” 结果，可以找一些 “分词“ 库。
     */
    public static String get(String src, boolean fullSpell) {
        // trim 效果是去掉字符串两侧的空白字符，也可以去掉两侧的 \t \n ....
        // eg：   \t    hello   \n  => hello
        if(src == null || src.trim().length() == 0) {
            return null;
        }

        // 针对 Pinyin4j 稍作配置，让它输出的 yu: 这个拼音，能够用 yv 表示
        // 使用 HanyuPinyinOutputFormat 来格式化返回拼音的格式
        HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat();
        format.setVCharType(HanyuPinyinVCharType.WITH_V); // 用v表示ü (nv)

        // 遍历字符串的每个字符，针对每个字符分别进行转换，把转换到的拼音的结果，拼接到 StringBuilder 里面
        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < src.length(); i++) {
            char ch = src.charAt(i);
            String[] tmp = null; // tmp[] 存放的是当前 汉字 所有的拼音
            try {
                // 针对单个字符进行转换 ==》将汉字转换为对应的拼音
                // 返回值，是一个 String[]，由于汉字里面存在多音字，这里就是把所有可能的读音，都列出来了。
                tmp = PinyinHelper.toHanyuPinyinStringArray(ch, format);
            } catch (BadHanyuPinyinOutputFormatCombination e) {
                e.printStackTrace();
            }

            // 分情况将对应的 pinyin 加入到 StringBuilder 中
            if(tmp == null || tmp.length == 0) {
                /*
                如果结果是空的，说明转换失败了，如果输入的字符，没有汉语拼音，自然就是转换失败了
                eg：输入的字符为 a, b, c, 1, 2, 3 .....，本身就没有拼音，所以转换会失败
                    那么就要保留原始字符，直接把原始字符加入结果中
                 */
                stringBuilder.append(ch);
            } else if(fullSpell) {
                // 拼音结果非空，并且获取 完整拼音
                stringBuilder.append(tmp[0]); // 0号下标存放的是当前汉字的多音字当中第一种最常见的拼音
            } else {
                // 拼音非空，并且获取到拼音首字母
                // eg：“朝” =》["chao2","zhao1"]，此时取 0 号元素，得到了 "chao"，再取 0 号字符，得到 c
                stringBuilder.append(tmp[0].charAt(0));
            }
        }
        return stringBuilder.toString();
    }
}
